、從讀取資料,進階到新增資料
昨天,我們成功使用 JDBC 查詢 MySQL 裡的病患資料。
但是一個基本的醫療資訊系統,不能只有查看資料的功能,也需要讓使用者新增病患紀錄。
例如,當櫃檯人員登記一位新病患時,系統就需要將姓名、性別、生日和電話寫進資料庫。
今天我們的目標是:
使用 Java、JDBC 和 SQL,新增一筆病患資料。
二、先認識 INSERT INTO
在 MySQL 中,新增資料常常會使用 INSERT INTO。
例如:
INSERT INTO patient (name, gender, birthday, phone)
VALUES ('小明', '男', '2006-01-21', '0912345678');
這段 SQL 的意思是,將一筆新紀錄新增到 patient 資料表。
因為之前建立資料表時,id 使用了 AUTO_INCREMENT,所以 MySQL 會自動產生新的編號,不需要我們手動輸入。
可以在 MySQL 執行:
SELECT * FROM patient;
確認新增的資料是否存在。
三、在 Java 中使用 PreparedStatement
接著,我們把新增資料的工作交給 Java。
建立一個 TestPatientInsert.java:
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import util.DBConnection;
public class TestPatientInsert {
public static void main(String[] args) {
String sql = "INSERT INTO patient "
+ "(name, gender, birthday, phone) "
+ "VALUES (?, ?, ?, ?)";
try (
Connection conn = DBConnection.getConnection();
PreparedStatement ps = conn.prepareStatement(sql)
) {
ps.setString(1, "小明");
ps.setString(2, "男");
ps.setDate(
3,
java.sql.Date.valueOf("2006-01-21")
);
ps.setString(4, "0912345678");
int rows = ps.executeUpdate();
System.out.println("成功新增筆數:" + rows);
} catch (SQLException e) {
e.printStackTrace();
}
}
}
執行後,如果新增成功,通常會看到:
成功新增筆數:1
這代表資料庫回報有一筆資料受到這次操作影響。
四、看懂程式的關鍵部分
String sql = "INSERT INTO patient "
+ "(name, gender, birthday, phone) "
+ "VALUES (?, ?, ?, ?)";
這裡有四個問號,分別對應姓名、性別、生日和電話。
使用參數的好處是,不必自己處理每一個值的引號和格式,也能避免直接串接輸入內容所造成的 SQL Injection 風險。
ps.setString(1, "小明");
ps.setString(2, "男");
ps.setDate(3, java.sql.Date.valueOf("2006-01-21"));
ps.setString(4, "0912345678");
參數的位置從 1 開始,不是從 0 開始。
程式 對應欄位
setString(1, ...) name
setString(2, ...) gender
setDate(3, ...) birthday
setString(4, ...) phone
電話雖然看起來像數字,但通常應以字串處理,因為電話可能有開頭的 0、國碼或其他符號。
int rows = ps.executeUpdate();
executeUpdate() 常用於 INSERT、UPDATE 和 DELETE 等會改變資料的 SQL,回傳受影響的資料筆數。
它和昨天使用的 executeQuery() 不一樣:
五、怎麼確認資料真的新增了?
Java 顯示成功訊息後,我們還是可以回到 MySQL 執行:
SELECT id, name, gender, birthday, phone
FROM patient;
如果結果出現新的紀錄,就代表新增操作確實寫入了資料庫。
這裡也要提醒:測試程式每執行一次,就可能新增一筆重複的資料。正式系統應根據需求設計資料驗證,避免重複登記。
六、把新增功能放進真正的系統之前
今天使用的是 main() 方法測試 JDBC,還不是完整的網頁功能。
未來真正的操作流程會更接近:
使用者填寫病患表單
↓
HTML 表單送出
↓
Servlet 接收資料
↓
PreparedStatement 執行 INSERT
↓
MySQL 儲存資料
↓
網頁顯示新增結果
此外,實際的醫療系統還需要處理必填欄位、日期格式、電話格式、使用者權限和操作紀錄。測試資料也不能直接換成未經授權的真實病患資料。
今日小結
今天我們學會使用 INSERT INTO 和 PreparedStatement,將資料新增到 MySQL。
這篇最重要的三個觀念是:
Day 18 完成!
下一篇,我們要把查詢結果整理成病患清單,讓系統不只會存取資料,也開始具備基本的資料展示功能。
參考資料:MySQL Connector/J 官方文件